parser grammar ExpresionesParser;

options {
  language = Java;
  tokenVocab = ExpresionesLexer;
}


@header {
  package PL.practica8;
  import java.util.Hashtable;
}


@members {
  Hashtable<String, Integer> variables = new Hashtable<String, Integer>();
  ArrayList <RecognitionException> errores = new ArrayList<RecognitionException>();

	public boolean listaVacia (){
	    if (errores.isEmpty()){
	      return true;
	    }else
	      return false;
	}
	
	public ArrayList getListaErrores(){return errores;}
	
	
	@Override
	public void reportError (RecognitionException e){
	  System.err.println (getErrorMessage(e, getTokenNames()));
	  errores.add(e);
}

}


entrada: (asignacion|instruccion)*;

   asignacion : id=ID ASIGNACION e=expr SEPARADOR {
    System.out.println("Asignacion (" + id.getText() + ") => " + e);
      variables.put(id.getText(), new Integer(e));
      
  };


   instruccion : e=expr SEPARADOR  {
    System.out.println("Expresion => " + e);
  };
  
 expr returns [int res=0]: e1=exp_mult { res = e1; } ((MAS e2=exp_mult) { res = res + e2; } 
 | (MENOS e2=exp_mult))* {res=e1+e2;};
     
     
     
 exp_mult  returns [int res = 0] :  e1=exp_base {res=e1;} ((ASTERISCO e2=exp_base { res = res * e2; } ) 
 | (SLASH e2=exp_base  { res = res / e2; }))* ;
   catch [ArithmeticException ae] {System.err.println("Error aritmetico");}
 
 exp_base returns [int res = 0]:  n = NUMERO { res = Integer.parseInt(n.getText()); }
  | ABRIRPARENTESIS e=expr CERRARPARENTESIS { res = e; }
  | id = ID { res = variables.get(id.getText()); };